iT邦幫忙

2022 iThome 鐵人賽

DAY 23
0
自我挑戰組

被MongoDB用Aggregate暴打的後端小菜雞日記系列 第 23

被MongoDB用Index暴打的後端小菜雞日記-day23- 什麼是index?

  • 分享至 

  • xImage
  •  

誒誒誒誒!!MongoDB竟然換武器攻擊小菜雞了,難道是小菜雞終於成長到,可以輕鬆接下aggregate的攻擊,所以換武器了嗎?(才不是作者想不到aggregate還有什麼運用可以介紹,所以換主題的)

所謂的Index索引,可以想像資料庫的資料就像百科全書的每一頁內文,而index就是書裡面的目錄,透過瀏覽目錄你可以快速找到你想要看的內容是在第幾頁。

而Index是如何快速找到資料,這就必須先提到在MongoDB儲存index會使用到的 B tree 資料結構。

假設我們現在利用 B tree 儲存1–7的數字,如下圖

資料儲存時會按照數字大小進行排序,左邊的數值會小於右邊的數值,在進行資料搜尋時,會有一個好處是一次可以排除一半的資料,加快搜尋速度。

例如:我們現在要搜尋5所在的位置,一開始會先從樹的最頂端開始找起,5先與4比對,比較大所以往右邊往下找,遇到6跟它比對,比較小所以往左邊走,最後找到資料。

如果是一個一個資料比對,最慘的情況下會比對7次,但如果是用B tree儲存資料,搜尋時最慘只會比對3次,如果我們把資料拉大成100筆資料,最多也只需要比對7次,不會比對到100次這麼多。


因為上述的特性,在資料的數量很龐大的情況下,建立索引的確可以加快搜尋的速度,但並不是所有情境都適合建立索引。

比如說我們現在有交易訂單的紀錄,每天都有好幾百筆資料寫入,但是會計部門只會在每個月底搜尋訂單算帳,這時候就不適合建立索引,因為資料會頻繁的寫入。

而且除了一般寫入的行為,MongoDB還必須額外寫入索引,同時為了確保B tree儲存資料會按照指定的順序,再寫入時會頻繁變動到 B tree的結構,所以寫入時會花費比較多的時間,而我們實際搜尋的次數卻很少,因此不太適合建立索引。

如上圖,我們寫入越多筆資料,B tree的樹狀結構就會有更多的分支出現,也更多層。

PS . 如果大家想動手,輸入資料建立 B tree ,在這裡推薦一個視覺化的網站B-Tree Visualization,上述的圖片都是用這個網站做出來的,在輸入資料時,也可會有動畫看到 B tree的樹狀結構是怎麼改變的。

本篇文章同步放在我的部落格,大家有空可以進來逛逛


上一篇
被MongoDB用Aggregate暴打的後端小菜雞日記-day22-那些年你不知道的Aggregate大小事
下一篇
被MongoDB用Index暴打的後端小菜雞日記-day 24- index使用懶人包
系列文
被MongoDB用Aggregate暴打的後端小菜雞日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言